package com.ssu.judea.palmssu.controller;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.log4j.Logger;
import org.json.JSONArray;

import statics.PalmVars;

import com.ssu.judea.palmssu.model.AndroidDAO;
import com.ssu.judea.palmssu.vo.GraphItem;
import com.ssu.judea.palmssu.vo.Member;


import comm.util.PalmHashMap;
import comm.util.RequestManager;

public class AndroidServlet extends PalmServlet {
	
	private Logger logger = Logger.getLogger(AndroidServlet.class);
	
	@Override
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		super.service(request, response);
		
		PalmHashMap hm = RequestManager.getRequest(request);
		
		AndroidDAO dao = new AndroidDAO();
		
		if(hm==null || hm.get("ACTION")==null || hm.get("ACTION").toString().length()<1){
			//action parameter가 없이 요청이들어온경우 
			response.getWriter().write("Please request valid");
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("auth")){
			//계정 연동을 위한 To Authpage
			dao.toAuthpage(request, response);
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("toTwitter")){
			//Twitter페이지로 포워딩
			dao.toTwitterPage(request, response);
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("callback")){
			//트위터에서 계정 연동 Allow 완료후 callback된 페이지로 요청이 들어온 경우
			//저장된 계정정보를 안드로이드로 response
			try {
				Member result = dao.authorizeFromMobile(request,response);
				
				if(result.getMemberseq()>0){
					request.setAttribute("AUTH_RESULT", PalmVars.SUCCESS);
					request.setAttribute("MEMBER", result);
					
					logger.debug("인증완료"+result.getMemberseq());
				}else{
					request.setAttribute("AUTH_RESULT", PalmVars.FAIL);
				}
				
				request.getRequestDispatcher("/jsp/android/authresult.jsp").forward(request, response);
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("checkAuth")){
			//서버에서 유지되고 있는 session Id를 통해 연동된 회원 정보 Response
			if(request.getSession().getId()!=null && request.getSession().getId().length()>0 ){
				Member checkMem = dao.getMemberBySession(request.getSession().getId());
				if(checkMem!=null){
					request.setAttribute("CURRENT_MEMBER", checkMem);
				}
				request.getRequestDispatcher("/jsp/android/checkauth.jsp").forward(request, response);
			}
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("getCurrentSession")){
			//현재 세션ID값 가져오기
			if(request.getSession().getId().length()>0){
				request.getRequestDispatcher("/jsp/android/returnCurrentSessionId.jsp").forward(request, response);
			}else{
				response.getWriter().write(" ");
			}
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("stopStudy")){
			//공부 스탑!
			if(hm.get("SEQ")!=null && hm.get("STUDY_SEQ")!=null){
				//end 시각 등록
				dao.updateEndStudyTime(hm.get("SEQ").toString(),hm.get("STUDY_SEQ").toString());
			}
			response.getWriter().write(PalmVars.SUCCESS);
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("logout")){
			//세션 정보 삭제
			request.getSession().invalidate();
			response.getWriter().write(PalmVars.SUCCESS);
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("write")){
			//Study 시작 기록
			PalmHashMap resultHm = new PalmHashMap();
			Member checkMem = dao.getMemberBySession(request.getSession()!=null?request.getSession().getId():"");
			
			if(hm.get("TEXT")!=null&&hm.get("SEQ")!=null&&checkMem!=null){
				if(checkMem.getMemberseq()==Integer.parseInt(hm.get("SEQ").toString())){
					//세션에 할당되어 있는 회원정보와 요청이 들어온 회원정보가 일치할경우만 포스팅 진행
					String result = dao.doWrite(hm.get("TEXT").toString(),hm.get("ROOM").toString(),hm.get("SEAT").toString(), (hm.get("TWITTER")!=null), request.getSession().getId());
					resultHm.put("RESULT", result);
					resultHm.put("MESSAGE", "정상적으로 포스팅되었습니다.\n 벨소리는 무음모드로 변경됩니다.\n 열공~!");
				}else{
					resultHm.put("RESULT", PalmVars.FAIL);
					resultHm.put("MESSAGE", "정상적인 접근이 아닙니다.\n 다시 로그인 한 후 진행해주세요:)");
				}
			}else if(checkMem==null){
				resultHm.put("RESULT", PalmVars.FAIL);
				resultHm.put("MESSAGE", "로그인 유지 시간이 지났습니다.");
			}
			request.setAttribute("RESULT_MAP", resultHm);
			
			request.getRequestDispatcher("jsp/android/writeResult.jsp").forward(request, response);
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("getMatchingList")){
			//자신과 매칭이 되는 리스트 요청
			if(hm.get("SEQ")!=null)
				request.setAttribute("list", dao.getMatchingList(hm.get("SEQ").toString()) );
			request.getRequestDispatcher("jsp/android/listResult.jsp").forward(request, response);
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("getRecentList")){
			//최근 Study시작 리스트 요청
			if(hm.get("SEQ")!=null)
				request.setAttribute("list", dao.getRecentList(hm.get("SEQ").toString()) );
			request.getRequestDispatcher("jsp/android/listResult.jsp").forward(request, response);
			
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("getFollowersList")){
			//나의 Follower들의 최근 공부 기록 리스트 요청
			if(hm.get("SEQ")!=null)
				request.setAttribute("list", dao.getFollowersList(hm.get("SEQ").toString()) );
			request.getRequestDispatcher("jsp/android/listResult.jsp").forward(request, response);
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("writeMention")){
			//Study 시작 기록
			PalmHashMap resultHm = new PalmHashMap();
			Member checkMem = dao.getMemberBySession(request.getSession()!=null?request.getSession().getId():"");
			
			if(hm.get("TEXT")!=null&&hm.get("SEQ")!=null&&checkMem!=null){
				if(checkMem.getMemberseq()==Integer.parseInt(hm.get("SEQ").toString())){
					//세션에 할당되어 있는 회원정보와 요청이 들어온 회원정보가 일치할경우만 포스팅 진행
					String result = dao.doWriteMention(hm.get("TEXT").toString(), checkMem.getTwitterpasskey());
					resultHm.put("RESULT", result);
					resultHm.put("MESSAGE", "정상적으로 포스팅되었습니다.");
				}else{
					resultHm.put("RESULT", PalmVars.FAIL);
					resultHm.put("MESSAGE", "정상적인 접근이 아닙니다.\n 다시 로그인 한 후 진행해주세요:)");
				}
			}else if(checkMem==null){
				resultHm.put("RESULT", PalmVars.FAIL);
				resultHm.put("MESSAGE", "로그인 유지 시간이 지났습니다.");
			}
			request.setAttribute("RESULT_MAP", resultHm);
			
			request.getRequestDispatcher("jsp/android/writeResult.jsp").forward(request, response);
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("follow")){
			//Study 시작 기록
			PalmHashMap resultHm = new PalmHashMap();
			Member checkMem = dao.getMemberBySession(request.getSession()!=null?request.getSession().getId():"");
			
			if(hm.get("TARGET")!=null&&hm.get("SEQ")!=null&&checkMem!=null){
				if(checkMem.getMemberseq()==Integer.parseInt(hm.get("SEQ").toString())){
					//세션에 할당되어 있는 회원정보와 요청이 들어온 회원정보가 일치할경우만 포스팅 진행
					String result = dao.doFollow(hm.get("TARGET").toString(), checkMem.getTwitterpasskey());
					
					resultHm.put("RESULT", result);
					if(result.equals(PalmVars.SUCCESS))
						resultHm.put("MESSAGE", "Follow했습니다.");
					else
						resultHm.put("MESSAGE", "이미 Follow중이거나, 실패하였습니다.");
				}else{
					resultHm.put("RESULT", PalmVars.FAIL);
					resultHm.put("MESSAGE", "정상적인 접근이 아닙니다.\n 다시 로그인 한 후 진행해주세요:)");
				}
			}else if(checkMem==null){
				resultHm.put("RESULT", PalmVars.FAIL);
				resultHm.put("MESSAGE", "로그인 유지 시간이 지났습니다.");
			}
			request.setAttribute("RESULT_MAP", resultHm);
			
			request.getRequestDispatcher("jsp/android/writeResult.jsp").forward(request, response);
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("getStudyTimeline")){
			//넘어온 값을 date를 기준으로 -2 ~ +2일 간의 스터디 기록을 가져온다.
			ArrayList<GraphItem> result = null;
			if(hm.get("DATE")!=null&&hm.get("SEQ")!=null){
				String targetDate = hm.get("DATE").toString();
				String curClientSeq = hm.get("SEQ").toString();
				
				result = dao.getStudyTimeLine(curClientSeq,targetDate);
				
			}else{
				result = new ArrayList<GraphItem>();
			}
			
			request.setAttribute("RESULT_STUDY_TIMELINE", result);
			
			request.getRequestDispatcher("jsp/android/studyTimeline.jsp").forward(request, response);
		}else if(hm.get("ACTION")!=null && hm.get("ACTION").toString().equals("getFollowersInfo")){
			ArrayList<Member> result = null;
			if(hm.get("SEQ")!=null){
				String curClientSeq = hm.get("SEQ").toString();
				
				result = dao.getFollowersInfo(curClientSeq);
				
			}else{
				result = new ArrayList<Member>();
			}
			
			request.setAttribute("RESULT_FOLLOWERS_INFO", result);
			
			request.getRequestDispatcher("jsp/android/resultFollowersInfo.jsp").forward(request, response);
		}
	}
}
